package org.javahispano.javacup.tacticas_aceptadas.sjvc;
import org.javahispano.javacup.modelo.*;

import java.util.List;
import java.util.Random;

public class Comandos {

	private static Random rand = new Random();
	
	public static void Pase(SituacionPartido sp, int jugadorConElBalon, int jugadorQueRecibe, List<Comando> comandos){

		//Comprobar si hay un jugador contrario entre mis jugadores para hacer pase alto o no
		//o si hay que hacer pase alto para llegar mas lejos
		double distancia = sp.misJugadores()[jugadorConElBalon].distancia(sp.misJugadores()[jugadorQueRecibe]);
		boolean paseAlto = Situaciones.HayJugadoresEntreDosJugadoresPropios(sp, jugadorConElBalon, jugadorQueRecibe);
		if(!paseAlto && distancia > Situaciones.MaximaDistanciaGolpe(sp, jugadorConElBalon, false))
			paseAlto = true;
		
		//Obtener fuerza
		double fuerza = Situaciones.ObtenerFuerzaParaGolpear(sp, jugadorConElBalon, sp.misJugadores()[jugadorQueRecibe], paseAlto);
		
		//Generar comando
		comandos.add(new ComandoGolpearBalon(jugadorConElBalon, sp.misJugadores()[jugadorQueRecibe], fuerza, paseAlto));
	}
	
	public static void PaseAlMasCercano(SituacionPartido sp, int jugadorConElBalon, List<Comando> comandos){
		//Determinar situiente jugador mas cercano
		int jugadorQueRecibe = sp.misJugadores()[jugadorConElBalon].indiceMasCercano(sp.misJugadores(), jugadorConElBalon);
		
		Pase(sp, jugadorConElBalon, jugadorQueRecibe, comandos);
	}
	
	public static void DespejarDesdeLaPorteria(SituacionPartido sp, int jugadorConElBalon, List<Comando> comandos){
		comandos.add(new ComandoGolpearBalon(0, new Posicion((sp.iteracion()%2 == 0 ? 1 : -1) * rand.nextDouble() * Constantes.ANCHO_CAMPO_JUEGO/2, Constantes.centroCampoJuego.getY()), 1, true));
	}
	
	public static void PaseHaciaAdelante(SituacionPartido sp, int jugadorConElBalon, List<Comando> comandos){
		//El jugador que tiene el balon la pasa a otro mas adelantado
		int jugadorAlQueLePaso = -1;
		for(int i : sp.balon().indicesMasCercanos(sp.misJugadores(), 0)){
			if(i!=jugadorConElBalon && sp.misJugadores()[i].getY() > sp.balon().getY()) //ests mas adelantado
			{
				jugadorAlQueLePaso = i;
				break;
			}
		}
		
		//Si hay un jugador cercano le paso, sino chuto a portería
		if(jugadorAlQueLePaso >= 0)
			Comandos.Pase(sp, jugadorConElBalon, jugadorAlQueLePaso, comandos);
		else
			comandos.add(new ComandoGolpearBalon(jugadorConElBalon, Constantes.centroArcoSup, 1, false));
	}
	
	public static void IrAPorElBalon(SituacionPartido sp, int numJugadoresQueCorren, List<Comando> comandos){
		IrAPorElBalon(sp, numJugadoresQueCorren, comandos, -1);
	}
	
	public static void IrAPorElBalon(SituacionPartido sp, int numJugadoresQueCorren, List<Comando> comandos, int indiceExcluido){
		int[] excl = new int[1];
		excl[0] = indiceExcluido;
		IrAPorElBalon(sp, numJugadoresQueCorren, comandos, excl);
	}
	
	public static void IrAPorElBalon(SituacionPartido sp, int numJugadoresQueCorren, List<Comando> comandos, int[] indicesExcluidos){

		int jugadoresCorriendo = 0;
		for(int i : sp.balon().indicesMasCercanos(sp.misJugadores(), 0)){
			if(!ArrayContiene(indicesExcluidos, i)){
				comandos.add(new ComandoIrA(i, sp.balon()));
				if(++jugadoresCorriendo == numJugadoresQueCorren) break;
			}
		}
	}
	
	public static boolean ArrayContiene(int[] array, int valor){
		for(int i=0;i<array.length;i++)
			if(array[i] == valor)
				return true;
		return false;
	}
	
	
}